package com.sugon.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.sugon.dao.ApiTokenMapper;
import com.sugon.entity.TokenEntity;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class TokenService {

    @Resource
    private ApiTokenMapper tokenDao;

    /**
     * TOKEN有效期：15分钟 单位是秒
     */
    private final static int EXPIRE = 900;

    /**
     * queryByUserId
     *
     * @param userId
     * @return
     */
    public TokenEntity queryByUserId(String userId) {
        return tokenDao.queryByUserId(userId);
    }

    /**
     * queryByToken
     *
     * @param token
     * @return
     */
    public TokenEntity queryByToken(String token) {
        return tokenDao.queryByToken(token);
    }

    /**
     * save
     *
     * @param token
     */
    public void save(TokenEntity token) {
        tokenDao.save(token);
    }

    /**
     * update
     *
     * @param token
     */
    public void update(TokenEntity token) {
        tokenDao.update(token);
    }

    /**
     * createToken
     *
     * @param userId
     * @return
     */
    public Map<String, Object> createToken(String userId) {
        //生成一个token
        String token = RandomUtil.randomString(32);
        //当前时间
        Date now = new Date();
        //过期时间
        Date expireTime = new Date(now.getTime() + EXPIRE * 1000);
        //判断是否生成过token
        TokenEntity tokenEntity = queryByUserId(userId);
        if (tokenEntity == null) {
            tokenEntity = new TokenEntity();
            tokenEntity.setUserId(userId);
            tokenEntity.setToken(token);
            tokenEntity.setUpdateTime(now);
            tokenEntity.setExpireTime(expireTime);
            save(tokenEntity);
        } else {
            tokenEntity.setToken(token);
            tokenEntity.setUpdateTime(now);
            tokenEntity.setExpireTime(expireTime);
            //更新token
            update(tokenEntity);
        }
        // 构建返回值
        Map<String, Object> map = new HashMap<>(2);
        map.put("token", token);
        map.put("expire", expireTime.getTime());
        return map;
    }

    /**
     * 刷新token过期时间
     *
     * @param tokenEntity
     * @return
     */
    public void refreshTokenExpireTime(TokenEntity tokenEntity) {
        Date now = DateUtil.date();
        //过期时间 = 当前系统时间 + 30分钟
        Date expireTime = DateUtil.offsetMinute(now, 30);
        tokenEntity.setExpireTime(expireTime);
        tokenEntity.setUpdateTime(now);
        update(tokenEntity);
    }

}
